/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.celularessuc.gco.neg;

import com.jjsoft.celularessuc.gco.dao.GenericController;
import com.jjsoft.celularessuc.gco.mdl.Articulo;
import com.jjsoft.celularessuc.gco.mdl.Articulosucursal;
import com.jjsoft.celularessuc.gco.mdl.DetalleCompra;
import com.jjsoft.celularessuc.gco.mdl.FacturaCompra;
import com.jjsoft.celularessuc.gco.mdl.Proveedor;
import com.jjsoft.celularessuc.gco.mdl.ProveedorArticulo;
import com.jjsoft.celularessuc.gco.mdl.Serie;
import com.jjsoft.celularessuc.gco.mdl.Sucursal;
import com.jjsoft.celularessuc.gco.util.ArticuloValidadorException;
import com.jjsoft.celularessuc.gco.util.FacturaYaVendidaException;
import com.jjsoft.celularessuc.gco.util.configuraciones;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.avro.generic.GenericData;

/**
 *
 * @author Johnny
 */
public class FacturaCompraManager {

    GenericController<FacturaCompra> controladorFactura = new GenericController<FacturaCompra>();
    ArticuloManager am = new ArticuloManager();
    SerieManager sm = new SerieManager();
    ProveedorManager pm = new ProveedorManager();
    ArticuloSucursalManager asm = new ArticuloSucursalManager();
    List<Serie> listaSeries = new ArrayList<Serie>();
    GenericController<Articulo> controladorArticulo = new GenericController<Articulo>();

    public void guardarFactura(FacturaCompra factura) {
        for (DetalleCompra detalle : factura.getDetalleCompraList()) {
            detalle.setIdFactura(factura);
            if (detalle.getIdArticulo().getModo() == 0) {
                RegistraArticuloNuevo(detalle);
            } else if (detalle.getIdArticulo().getModo() == 1) {
                ModificaArticulo(detalle);
            } else if (detalle.getIdArticulo().getModo() == 2) {
                if (detalle.getIdArticulo().getSeries()) {
                    registraSerie(detalle);
                }
                asm.AumentarStock(detalle.getIdArticulo(), configuraciones.getInstance().getSucursal(), detalle.getCantidad());
                registraProveedor(detalle);
            }
        }
        controladorFactura.create(factura);
    }

    public void ModificaArticulo(DetalleCompra detalle) {
        try {
            controladorArticulo.edit(detalle.getIdArticulo());
            if (detalle.getIdArticulo().getSeries()) {
                registraSerie(detalle);
            }
            asm.AumentarStock(detalle.getIdArticulo(), configuraciones.getInstance().getSucursal(), detalle.getCantidad());
            registraProveedor(detalle);

        } catch (Exception ex) {
            Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void RegistraArticuloNuevo(DetalleCompra detalle) {
        if (am.buscarPorCodigo(detalle.getIdArticulo().getCodArticulo()) == null) { //se registra nuevoArticulo
            listaSeries = new ArrayList<Serie>();
            if (detalle.getIdArticulo().getSeries()) {
                Serie serie = new Serie();
                serie.setEstado(0);
                serie.setIdArticulo(detalle.getIdArticulo());
                serie.setIdSucursal(configuraciones.getInstance().getSucursal());
                serie.setNumSerie(detalle.getSerie());
                listaSeries.add(serie);
            }
            detalle.getIdArticulo().setSerieList(listaSeries);
            List<Proveedor> proveedor = new ArrayList<Proveedor>();
            proveedor.add(detalle.getIdFactura().getIdProveedor());
            try {
                detalle.getIdArticulo().setStock(detalle.getCantidad());
                am.crearProducto(detalle.getIdArticulo(), proveedor);

            } catch (ArticuloValidadorException ex) {
                Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            if (detalle.getIdArticulo().getSeries()) {
                registraSerie(detalle);
            }
            asm.AumentarStock(detalle.getIdArticulo(), configuraciones.getInstance().getSucursal(), detalle.getCantidad());
        }
    }

    public void registraSerie(DetalleCompra detalle) {
        Serie serie = new Serie();
        serie.setEstado(0);
        serie.setIdArticulo(detalle.getIdArticulo());
        serie.setIdSucursal(configuraciones.getInstance().getSucursal());
        serie.setNumSerie(detalle.getSerie());
        sm.registraSerie(serie);
    }

    public void registraProveedor(DetalleCompra detalle) {
        detalle.getIdArticulo().setProveedorArticuloList(am.obtenProveedores(detalle.getIdArticulo()));
        boolean existe = false;
        for (ProveedorArticulo prov : detalle.getIdArticulo().getProveedorArticuloList()) {
            if (detalle.getIdFactura().getIdProveedor().equals(prov.getIdProveedor())) {
                existe = true;
                break;
            }
        }
        if (!existe) {
            GenericController<ProveedorArticulo> controladorProvArt = new GenericController<ProveedorArticulo>();
            ProveedorArticulo provArt = new ProveedorArticulo();
            provArt.setCodigoArticulo(detalle.getIdArticulo());
            provArt.setIdProveedor(detalle.getIdFactura().getIdProveedor());
            controladorProvArt.create(provArt);
        }
    }

    public FacturaCompra buscarPorNumero(int numero, Proveedor proveedor) {
        try {
            FacturaCompra factura = controladorFactura.findWhere(new FacturaCompra(), "numFactura=" + numero + " and idProveedor=" + proveedor.getIdProveedor()).get(0);
            GenericController<DetalleCompra> cdt = new GenericController<DetalleCompra>();
            List<DetalleCompra> listadetalle = cdt.findWhere(new DetalleCompra(), "idFactura=" + factura.getIdFactura());
            factura.setDetalleCompraList(listadetalle);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }

    public List<FacturaCompra> buscarPorProveedor(Proveedor proveedor) {
        try {
            List<FacturaCompra> facturas = controladorFactura.findWhere(new FacturaCompra(), "idProveedor=" + proveedor.getIdProveedor());
            return facturas;
        } catch (Exception ex) {
            return null;
        }
    }

    public List<FacturaCompra> buscarPorFechas(Date fecha1, Date fecha2) {
        String fechaIni = (fecha1.getYear() + 1900) + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate() + " 00:00:00";
        String fechafin = (fecha2.getYear() + 1900) + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate() + " 23:59:59";
        return controladorFactura.findWhere(new FacturaCompra(), "fecha_emision>='" + fechaIni + "' and fecha_emision<='" + fechafin + "'");
    }

    public DetalleCompra buscarDetalleSerie(Serie serie) {
        GenericController<DetalleCompra> cdt = new GenericController<DetalleCompra>();
        try {
            List<DetalleCompra> listadetalle = cdt.findWhere(new DetalleCompra(), "idArticulo=" + serie.getIdArticulo().getCodigo() + " and serie ='" + serie.getNumSerie() + "'");
            DetalleCompra detalle = listadetalle.get(listadetalle.size() - 1);
            return detalle;
        } catch (Exception ex) {
            return null;
        }
    }

    public List<DetalleCompra> buscarDetalle(FacturaCompra factura) {
        GenericController<DetalleCompra> controladorDetalle = new GenericController<DetalleCompra>();
        return controladorDetalle.findWhere(new DetalleCompra(), "idFactura=" + factura.getIdFactura());
    }

    public void anularFactura(FacturaCompra factura) throws FacturaYaVendidaException {
        factura.setEstado(1);
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm = new SerieManager();
        GastoManager gm = new GastoManager();
        for (DetalleCompra detalle : factura.getDetalleCompraList()) {
            String serie = detalle.getSerie();
            if (detalle.getSerie() != null && !detalle.getSerie().equals("")) {
                if (!sm.buscaSerie(detalle.getIdArticulo(), configuraciones.getInstance().getSucursal(), serie)) {
                    throw new FacturaYaVendidaException("Ya se han vendido o transferido articulos de esta factura");

                }
            }
        }
        try {
            controladorFactura.edit(factura);
            for (int i = 0; i < factura.getDetalleCompraList().size(); i++) {
                asm.ReducirStock(factura.getDetalleCompraList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetalleCompraList().get(i).getCantidad());
                if (!factura.getDetalleCompraList().get(i).getSerie().equals("")) {
                    sm.eliminaSerie(factura.getDetalleCompraList().get(i).getIdArticulo(), configuraciones.getInstance().getSucursal(), factura.getDetalleCompraList().get(i).getSerie());
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
